/**
 * 封装axios类
 */
import axios from "axios";

class Axios {
  constructor(url, requestTime) {
    // 注意：传入的 url 优先级最低，优先使用环境变量或默认 '/api'
    // 当 VITE_API_URL 存在时，应写成完整地址（如 http://z78672cd.natappfree.cc）
    const envApi = import.meta.env.VITE_API_URL; // Vite 环境变量
    this.url = envApi || url || "/api";
    this.axiosInstance = null;
    this.createService(this.url, requestTime);
  }

  createService(url, requestTime) {
    const timeout = requestTime || 10000;
    this.axiosInstance = axios.create({
      baseURL: url,// 现在是相对路径或环境中注入的完整地址
      withCredentials: true,
      timeout: timeout,
    });
    this.interceptorsRequestToken();
    //响应拦截器
    this.interceptorsResponseToken();
  }

  interceptorsRequestToken() {
    this.axiosInstance.interceptors.request.use(
      (config) => {
        // 保留原有的 .json 处理逻辑（会根据环境移除 .json 后缀）
        config.url = this.handleJsonSuffix(config.url);
        return config;
      },
      (error) => {
        return Promise.reject(error);
      },
    );
  }

  interceptorsResponseToken() {
    this.axiosInstance.interceptors.response.use(
      (response) => {
        const res = response.data

        //错误响应
        if (res.state > 0) {
            ElMessage.error(res.message || "系统出错");
            return new Promise(() => {
            });//此时的promise链停下来了
        } else if (res.state === -1) { // 未登录或者登录过期
            // to re-login
            ElMessageBox.alert('登录已经过期，请重新登录', '登录过期', {
                confirmButtonText: '重新登录',
                callback: () => {
                    //跳转登录页面
                    window.location.href = "/login";
                },
            })
            //此时的promise链停下来了
            return new Promise(() => {
            })
        } else {
            //成功 正确数据
            return res
        }
      },
      (error) => {
        ElMessage.error(error.message)
        //此时的promise链停下来了
        return new Promise(() => {});
      },
    );
  }

  getUrl() {
    return this.url;
  }

  getInstance() {
    return this.axiosInstance;
  }

  // 处理.json后缀（仅在生产环境会把 .json 去掉）
  handleJsonSuffix(url) {
    if (!url) return url;
    // 注意：import.meta.env.DEV 为 true 时表示 dev 模式
    // 不排除真的有请求.json的情况，偷懒嫌疑
    if (!import.meta.env.DEV && url.indexOf(".json") !== -1) {
      return url.replace(".json", "");
    } else {
      return url;
    }
  }
}

export default Axios;
